#!/bin/bash
# 该脚本提供了从仓库中查询是否引入了某个commit的功能

# 0：表示 commit 已合入分支
# 1：表示 commit 未合入分支
# 2：表示无法切换到指定分支
# 3：表示无法克隆或访问仓库
# 4：表示命令错误
# 5: 表示其他错误

# 设置退出时显示错误信息
set -euo pipefail

# 检查参数
if [ $# -ne 2 ]; then
  exit 4
fi

branch_name="$1"
commit_id="$2"
repo_path="$(pwd)/stash/kernel"  # 持久化仓库路径
remote_url="https://gitee.com/openeuler/kernel.git"

mkdir -p $(pwd)/stash

# 初始化仓库
init_repo() {
    echo "初始化仓库" "$repo_path"
    if [ ! -d "$repo_path/.git" ]; then
        git clone "$remote_url" "$repo_path"
        local clone_status=$?
        if [ $clone_status -ne 0 ]; then
            return 3  # 无法克隆仓库
        fi
    fi
    return 0
}

# 切换到指定分支
switch_branch() {
    echo "切换到分支$branch_name"
    # 检查分支是否存在
    if ! git -C "$repo_path" show-ref --verify --quiet "refs/heads/$branch_name"; then
        if ! git -C "$repo_path" fetch origin "$branch_name:$branch_name"; then
            return 2  # 无法拉取远程分支
        fi
    fi

    # 切换分支
    if ! git -C "$repo_path" checkout "$branch_name"; then
        return 2  # 无法切换到分支
    fi

    # 尝试普通拉取
    if ! git -C "$repo_path" pull --ff-only origin "$branch_name"; then
        echo "警告：无法快进拉取，尝试强制同步远程分支..." >&2
        # 强制重置本地分支到远程分支
        git -C "$repo_path" fetch origin "$branch_name" || return 3
        git -C "$repo_path" reset --hard "origin/$branch_name" || return 3
    fi
    return 0
}

# 查询是否存在commit_id
check_commit() {
    echo "在 $branch_name 中查询commit $commit_id "
    # 步骤1：使用 git show 检查 commit 是否存在于当前分支
    if git -C "$repo_path" show "$commit_id" >/dev/null 2>&1; then
        echo "commit $commit_id 已经合入分支 $branch_name"
        return 0  # Commit 已合入
    fi

    # 步骤2：如果 git show 失败，使用 git log --grep 进行进一步检查
    if git -C "$repo_path" log --max-count=1 --grep="$commit_id" "$branch_name" | grep -q "$commit_id"; then
        echo "commit $commit_id 已经合入分支 $branch_name"
        return 0  # Commit 已合入
    else
        echo "commit $commit_id 没有合入分支 $branch_name"
        return 1  # Commit 未合入
    fi
}

# 主流程
init_repo || exit 3
switch_branch || exit 2
check_commit
exit $?
